package pe.com.bbva.pct.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import pe.com.bbva.pct.dao.AplicacionDAO;
import pe.com.bbva.pct.domain.Aplicacion;
import pe.com.bbva.pct.util.ConstantesGenerales;
import pe.com.bbva.pct.vo.AplicacionVO;

@Repository("aplicacionDao")
public class AplicacionDAOImpl extends GeneralDAOImpl<Aplicacion> implements AplicacionDAO {

	@SuppressWarnings("unchecked")
	@Override
	public int cantidadTotalValores(AplicacionVO aplicacionVO)throws Exception{
		int cantidad=0;
		List<Aplicacion> listaAplicaciones =new ArrayList<Aplicacion>(); 
		try {

				StringBuilder queryString = new StringBuilder();
				queryString.append("SELECT p FROM Aplicacion p WHERE 1 = 1 AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
				
				if (aplicacionVO.getIdAplicacion()!=null ) {
					queryString.append(" AND p.idAplicacion = :pIdAplicacion ");
				}
				if (aplicacionVO.getCodigo()!=null && !aplicacionVO.getCodigo().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.codigo) like :pCodigo ");
				}
				if (aplicacionVO.getNombreCorto()!=null && !aplicacionVO.getNombreCorto().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.nombreCorto) like :pNombreCorto ");
				}	
				if (aplicacionVO.getNombreLargo()!=null  && !aplicacionVO.getNombreLargo().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.nombreLargo) like :pNonbreLargo ");
				}
				if (aplicacionVO.getIdEstado()!=null && !aplicacionVO.getIdEstado().trim().equals("0")) {
					queryString.append(" AND p.idEstado.idValor = :pIdEstado");
				}
				
				queryString.append(" ORDER BY p.codigo ASC ");
				
				Query query = em.createQuery(queryString.toString());
				
				if (aplicacionVO.getIdAplicacion()!=null ) {
					query.setParameter("pIdAplicacion", aplicacionVO.getIdAplicacion());
				}
				if (aplicacionVO.getCodigo()!=null && !aplicacionVO.getCodigo().trim().toUpperCase().equals("")) {
					query.setParameter("pCodigo", "%"+aplicacionVO.getCodigo().toUpperCase().trim()+"%");
				}
				if (aplicacionVO.getNombreCorto()!=null && !aplicacionVO.getNombreCorto().trim().toUpperCase().equals("")) {
					query.setParameter("pNombreCorto", "%"+aplicacionVO.getNombreCorto().toUpperCase().trim()+"%");
				}	
				if (aplicacionVO.getNombreLargo()!=null  && !aplicacionVO.getNombreLargo().trim().toUpperCase().equals("")) {
					query.setParameter("pNonbreLargo", "%"+aplicacionVO.getNombreLargo().toUpperCase().trim()+"%");
				}
				if (aplicacionVO.getIdEstado()!=null && !aplicacionVO.getIdEstado().trim().equals("0")) {
					query.setParameter("pIdEstado", Long.parseLong(aplicacionVO.getIdEstado().trim()));
				}
				
				listaAplicaciones= query.getResultList();	
				cantidad=listaAplicaciones.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cantidad;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Aplicacion> obtenerValoresPaginado(int first, int pageSize,AplicacionVO aplicacionVO) throws Exception{
		List<Aplicacion> listaAplicaciones =new ArrayList<Aplicacion>();  
		try {

			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT p FROM Aplicacion p WHERE 1 = 1 AND p.idEstado.idValor <> "+ ConstantesGenerales.VALOR_ELIMINADO );
			
			if (aplicacionVO.getIdAplicacion()!=null ) {
				queryString.append(" AND p.idAplicacion = :pIdAplicacion ");
			}
			if (aplicacionVO.getCodigo()!=null && !aplicacionVO.getCodigo().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.codigo) like :pCodigo ");
			}
			if (aplicacionVO.getNombreCorto()!=null && !aplicacionVO.getNombreCorto().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.nombreCorto) like :pNombreCorto ");
			}	
			if (aplicacionVO.getNombreLargo()!=null  && !aplicacionVO.getNombreLargo().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.nombreLargo) like :pNonbreLargo ");
			}
			if (aplicacionVO.getIdEstado()!=null && !aplicacionVO.getIdEstado().trim().equals("0")) {
				queryString.append(" AND p.idEstado.idValor = :pIdEstado");
			}
			
			queryString.append(" ORDER BY p.codigo ASC ");
			
			Query query = em.createQuery(queryString.toString());
			
			if (aplicacionVO.getIdAplicacion()!=null ) {
				query.setParameter("pIdAplicacion", aplicacionVO.getIdAplicacion());
			}
			if (aplicacionVO.getCodigo()!=null && !aplicacionVO.getCodigo().trim().toUpperCase().equals("")) {
				query.setParameter("pCodigo", "%"+aplicacionVO.getCodigo().toUpperCase().trim()+"%");
			}
			if (aplicacionVO.getNombreCorto()!=null && !aplicacionVO.getNombreCorto().trim().toUpperCase().equals("")) {
				query.setParameter("pNombreCorto", "%"+aplicacionVO.getNombreCorto().toUpperCase().trim()+"%");
			}	
			if (aplicacionVO.getNombreLargo()!=null  && !aplicacionVO.getNombreLargo().trim().toUpperCase().equals("")) {
				query.setParameter("pNonbreLargo", "%"+aplicacionVO.getNombreLargo().toUpperCase().trim()+"%");
			}
			if (aplicacionVO.getIdEstado()!=null && !aplicacionVO.getIdEstado().trim().equals("0")) {
				query.setParameter("pIdEstado", Long.parseLong(aplicacionVO.getIdEstado().trim()));
			}

		query.setFirstResult(first);
		query.setMaxResults(pageSize);
		listaAplicaciones = query.getResultList();
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaAplicaciones;
			
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Long obtenerUltimoCodigo() throws Exception{
		Long codigoAutogenerado=0L;
		
		try {
			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT MAX(p.codigo) FROM Aplicacion p");
			Query query = em.createQuery(queryString.toString());
			List<Object> results = query.getResultList();	
			codigoAutogenerado = Long.parseLong(results.get(0).toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return codigoAutogenerado;
	}
	
}
